// Tencent is pleased to support the open source community by making
// 蓝鲸智云 - 监控平台/日志平台 (BlueKing - Monitor/Log) available.
// Copyright (C) 2017-2022 THL A29 Limited, a Tencent company. All rights reserved.
// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://opensource.org/licenses/MIT
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
//

package tracesderiver

import (
	"go.opentelemetry.io/collector/model/pdata"
)

type metricItem struct {
	Val        float64
	Ts         pdata.Timestamp
	Dimensions map[string]string
}

type metricsBuilder struct {
	pbMetrics   pdata.Metrics
	metricSlice pdata.MetricSlice
}

func NewMetricsBuilder() *metricsBuilder {
	pbMetrics := pdata.NewMetrics()
	instMetrics := pbMetrics.ResourceMetrics().AppendEmpty().InstrumentationLibraryMetrics().AppendEmpty()
	instMetrics.Metrics()
	return &metricsBuilder{pbMetrics: pbMetrics, metricSlice: instMetrics.Metrics()}
}

func (b metricsBuilder) Get() pdata.Metrics {
	return b.pbMetrics
}

func (b metricsBuilder) Build(name string, ms ...metricItem) {
	metrics := b.metricSlice.AppendEmpty()
	metrics.SetDataType(pdata.MetricDataTypeGauge)
	metrics.SetName(name)

	for _, m := range ms {
		metric := metrics.Gauge().DataPoints().AppendEmpty()
		metric.SetDoubleVal(m.Val)
		metric.SetTimestamp(m.Ts)
		for k, v := range m.Dimensions {
			metric.Attributes().UpsertString(k, v)
		}
	}
}
